package vn.com.aptech.msh.utils;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

public class PaginationHelper<T> implements Serializable {

    private Integer pageSize;
    private List<T> data;
    private List<T> model;
    private Integer page;
    private Integer maxPage;
    private Integer resultSize;

    public PaginationHelper(Integer pageSize, List<T> data) {
        this.pageSize = pageSize;
        this.data = data;

        resultSize = data.size();
        Integer temp = resultSize % pageSize;
        maxPage = (resultSize - temp) / pageSize;
        if (temp > 0) {
            maxPage++;
        }
        page = 1;
        refresh();
    }

    public Integer getCurrentPage() {
        return page;
    }

    public Integer getMaxPage() {
        return maxPage;
    }

    public Integer getResultSize() {
        return resultSize;
    }

    public List<T> getModel() {
        return model;
    }

    public void refresh() {
        Integer firstMember = (page - 1) * pageSize;
        Integer lastMember = page * pageSize;
        if (lastMember > resultSize) {
            lastMember = resultSize;
        }
        model = data.subList(firstMember, lastMember);
    }

    public void gotoPage(Integer page) {
        if (page <= maxPage) {
            this.page = page;
            refresh();
        }
    }

    public void nextPage() {
        if (page < maxPage) {
            page++;
            refresh();
        }
    }

    public void firstPage() {
        page = 1;
        refresh();
    }

    public void lastPage() {
        page = maxPage;
        refresh();
    }

    public void previousPage() {
        if (page > 1) {
            page--;
            refresh();
        }
    }

    public List<Integer> getPagesCenter() {
        List<Integer> list = new ArrayList<Integer>();
        for (int i = 1; i <= maxPage; i++) {
            list.add(i);
//        if (page > 1) {
//            list.add(page - 1);
//        }
//        list.add(page);
//        if (page < maxPage) {
//            list.add(page + 1);
//        }

        }
        return list;
    }
}
